/*antlr4自动解决左递归的问题：
我们将语法规则还原到最开始的左递归形式，antlr4生成语法分析器后，观察HelloSyntaxParser.boolExpression(ctx)，
发现antlr4就是用的课程中讲到的方法，消除左递归的影响，绕开递归调用函数栈形成的父子关系策略
重构规则文法，改递归为循环，同时根据左结合特点形成父子关系策略 */

grammar AntlrHelloSyntax;  //lexer关键字意味着这是一个词法规则文件，名称是Hello，要与文件名相同

import HelloLexer;

// rule
program
    : expressionStmt+
    ;

expressionStmt
    : (intDeclaration | assignmentExpression | boolExpression) Semicolon
    ;

intDeclaration
    : Int Identifier (Assignment boolExpression)?
    ;

assignmentExpression
    : Identifier Assignment boolExpression
    ;

boolExpression
    : comparision
    | boolExpression And comparision
    | boolExpression Or comparision
    ;

comparision
    : additiveEx
    | additiveEx GT additiveEx
    | additiveEx LT additiveEx
    | additiveEx EQ additiveEx
    | additiveEx GE additiveEx
    | additiveEx LE additiveEx
    ;

additiveEx
    : multiplicativeEX
    | additiveEx Plus multiplicativeEX
    | additiveEx Minus multiplicativeEX
    ;

multiplicativeEX
    : primary
    | multiplicativeEX Star primary
    | multiplicativeEX Slash primary
    ;

primary
    : Identifier
    | IntLiteral
    | StringLiteral
    | LeftParen boolExpression RightParen
    ;
